package com.bookrecomm.dao;

import com.bookrecomm.entity.ReadHistory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 阅读历史数据访问接口
 * 提供用户阅读历史相关的数据库操作方法
 */
@Repository
public interface ReadHistoryRepository extends JpaRepository<ReadHistory, Long> {

    /**
     * 根据用户ID和图书ID查询阅读历史
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 阅读历史对象（可能为空）
     */
    Optional<ReadHistory> findByUser_IdAndBook_Id(Long userId, Long bookId);

    /**
     * 根据用户ID查询阅读历史
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 阅读历史分页列表
     */
    @Query("SELECT rh FROM ReadHistory rh WHERE rh.user.id = :userId ORDER BY rh.lastReadAt DESC")
    Page<ReadHistory> findByUserId(@Param("userId") Long userId, Pageable pageable);

    /**
     * 查询用户最近阅读的图书
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 阅读历史列表
     */
    @Query("SELECT rh FROM ReadHistory rh WHERE rh.user.id = :userId ORDER BY rh.lastReadAt DESC")
    List<ReadHistory> findRecentReadByUserId(@Param("userId") Long userId, Pageable pageable);

    /**
     * 统计用户阅读的图书数量
     * @param userId 用户ID
     * @return 图书数量
     */
    @Query("SELECT COUNT(DISTINCT rh.book.id) FROM ReadHistory rh WHERE rh.user.id = :userId")
    Long countBooksByUserId(@Param("userId") Long userId);

    /**
     * 统计用户总阅读时长
     * @param userId 用户ID
     * @return 总阅读时长（分钟）
     */
    @Query("SELECT SUM(rh.readTime) FROM ReadHistory rh WHERE rh.user.id = :userId")
    Long sumReadTimeByUserId(@Param("userId") Long userId);

    /**
     * 查询图书的阅读人数
     * @param bookId 图书ID
     * @return 阅读人数
     */
    @Query("SELECT COUNT(DISTINCT rh.user.id) FROM ReadHistory rh WHERE rh.book.id = :bookId")
    Long countReadersByBookId(@Param("bookId") Long bookId);

    /**
     * 查询热门阅读图书（根据阅读人数）
     * @param pageable 分页参数
     * @return 图书ID和阅读人数
     */
    @Query("SELECT rh.book.id, COUNT(DISTINCT rh.user.id) as readerCount FROM ReadHistory rh GROUP BY rh.book.id ORDER BY readerCount DESC")
    List<Object[]> findHotReadBooks(Pageable pageable);
    
    /**
     * 查询用户的所有阅读历史
     * @param userId 用户ID
     * @return 阅读历史列表
     */
    List<ReadHistory> findAllByUser_Id(Long userId);
    
    /**
     * 统计用户的阅读历史数量
     * @param userId 用户ID
     * @return 阅读历史数量
     */
    Long countByUser_Id(Long userId);
    
    /**
     * 删除用户的所有阅读历史
     * @param userId 用户ID
     */
    void deleteAllByUser_Id(Long userId);
}
